/**
 * @FilePath     : /src/lgmg_robots/agv_navigation/agv_navigate/include/agvNavigate/helpInc/magic_singleton.h
 * @Description  : 该文件实现了三种不同类型的单例模式，分别为 MagicSingleton、MagicSingleton2 和 MagicSingleton3。 
 *                  - MagicSingleton 使用局部静态变量实现单例，线程安全且简单。 
 *                  - MagicSingleton2 采用懒汉式单例模式，使用互斥锁确保线程安全。 
 *                  - MagicSingleton3 使用智能指针（std::shared_ptr）管理对象生命周期，支持参数化构造。 
 * @Author       : xiujun.yang
 * @Version      : 1.0.0
 * @LastEditors  : haibo haibo.yang@lgmgim.cn
 * @LastEditTime : 2024-12-19 16:45:55
 * @Copyright (c) 2024 by 临工智能信息科技有限公司, All Rights Reserved. 
**/ 
#pragma once

#include <mutex>
#include <memory>

//using namespace std;

//////////////////////////////////////////////////////////////////////////////
// C++11 thread safe
template <typename T>
class MagicSingleton
{
public:
    static T* GetInstance() {
        static T instance;  // 使用局部静态变量实现单例
        return &instance;
    }

private:
    MagicSingleton() = default;  // 使用默认构造函数
    ~MagicSingleton() = default; // 使用默认析构函数
};


template <typename T>
class MagicSingleton2
{
public:
    static T* GetInstance() {
        if (p_instance == nullptr) {
            std::lock_guard<std::mutex> lock(mutex_);
            if (p_instance == nullptr) {
                p_instance = new T();
            }
        }
        return p_instance;
    }

    static void DestroyInstance() {
        if (p_instance) {
            delete p_instance;
            p_instance = nullptr;
        }
    }

private:
    MagicSingleton2() = default;  // 使用默认构造函数
    ~MagicSingleton2() = default; // 使用默认析构函数

    static T* p_instance;
    static std::mutex mutex_;
};

template <typename T>
T* MagicSingleton2<T>::p_instance = nullptr;

template <typename T>
std::mutex MagicSingleton2<T>::mutex_;


template <typename T>
class MagicSingleton3 {
public:
    template <typename... Args>
    static std::shared_ptr<T> GetInstance(Args&&... args) {
        if (!m_instance) {
            std::lock_guard<std::mutex> lock(mutex_);
            if (!m_instance) {
                m_instance = std::make_shared<T>(std::forward<Args>(args)...);
            }
        }
        return m_instance;
    }

    static void DestroyInstance() {
        if (m_instance) {
            m_instance.reset();
            m_instance = nullptr;
        }
    }

private:
    MagicSingleton3() = default;                      // 使用默认构造函数
    MagicSingleton3(const MagicSingleton3&) = delete; // 禁止复制构造
    MagicSingleton3& operator=(const MagicSingleton3&) = delete; // 禁止赋值
    ~MagicSingleton3() = default;                     // 使用默认析构函数

    static std::shared_ptr<T> m_instance;
    static std::mutex mutex_;
};

template <typename T>
std::shared_ptr<T> MagicSingleton3<T>::m_instance = nullptr;

template <typename T>
std::mutex MagicSingleton3<T>::mutex_;

//auto pClass = MagicSingleton3<MyClass>::GetInstance("create");
//MagicSingleton3<MyClass>::DesInstance();

